﻿//AcademicPlanner - course registration planning web app.
//Copyright (C) 2009  Boubacar Diallo

//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.

//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.


using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AcademicPlanner.Data.Entities;
using NHibernate.Tool.hbm2ddl;
using NHibernate;

namespace AcademicPlanner.Data.Repositories
{
	/// <summary>
	/// CourseEntityRepository serves as the repository for <c>CourseEntity</c>s.
	/// </summary>
	/// <since>1.0</since>
	public class CourseEntityRepository : EntityRepository<CourseEntity>
    {
		internal override string DBTableName { get { return "courses"; } }

		/// <summary>
		/// Gets the prefix to be used when retrieving named queries for <c>CourseEntity</c>s.
		/// </summary>
		/// <since>1.0</since>
		protected override string NamedQueriesPrefix
		{
			get
			{
				return "CourseEntity";
			}
		}


		class InstanceHolder
		{
			internal static CourseEntityRepository INSTANCE = new CourseEntityRepository();
		}


		/// <summary>
		/// Gets the single CourseEntityRepository instance.
		/// </summary>
		/// <returns>The single instance of CourseEntityRepository.</returns>
		/// <since>1.0</since>
		internal static CourseEntityRepository GetInstance()
		{
			return InstanceHolder.INSTANCE;
		}

		/// <summary>
		/// Finds from the data storage all the <c>CourseEntity</c>s belonging
		/// to a <c>AcademicPlanEntity</c>.
		/// </summary>
		/// <remarks>
		/// This method calls <see cref="M:GetNamedQuery"/> to retrieved the
		/// query named with a suffix "for.academicplanentity".
		/// </remarks>
		/// <param name="pAcademicPlanEntityId">The id of the <c>AcademicPlanEntity</c></param>
		/// <returns>The collection of <c>CourseEntity</c>.</returns>
		/// <exception cref="T:AcademicPlanner.Data.DataException">
		/// Thrown with an error code of <c>DataErrorCode.QUERY_COURSE_ENTITY_FOR_ACADEMICPLAN_ENTITY_FAILED</c>
		/// when an error is reported by NHibernate. The <c>HibernateException</c> is
		/// accessible via the <c>InnerException</c> property.
		/// </exception>
		/// <since>1.0</since>
		public IList<CourseEntity> FindForAcademicPlanEntity(int pAcademicPlanEntityId)
		{
			IList<CourseEntity> rEnts;

			try
			{
				var vQuery = GetNamedQuery("for.academicplanentity");
				rEnts = QueryForAcademicPlanEntity(vQuery, pAcademicPlanEntityId);
			}
			catch (HibernateException vHx)
			{
				var vDx = new DataException(DataErrorCode.QUERY_COURSE_ENTITY_FOR_ACADEMICPLAN_ENTITY_FAILED, vHx);
				throw vDx;
			}

			return rEnts;
		}

		private IList<CourseEntity> QueryForAcademicPlanEntity(IQuery pQuery, int pAcademicPlanEntityId)
		{
			pQuery.SetInt32("id", pAcademicPlanEntityId);
			return pQuery.List<CourseEntity>();
		}
	}
}
